# To change this template, choose Tools | Templates
# and open the template in the editor.
module BatchProcess

  class GeneralNewsLetters

    def self.run
      puts "---------------------- Arranca el proceso GeneralNewsLetters.run ----------------------"

      #se obtienen todas las listas que estan pendiente de envio y que la fecha de envio es <= hoy
      news_to_send = GeneralNewsLetter.get_ready_to_send
      news_to_send.each do |news|
        process_news_letter news
      end

      #se envian los mails que hay pendientes de envio en la tabla NewsOfferedMaterial
      #agrupado por lista, cliente
      NewsOfferedMaterial.send_mails
    end

    def self.process_news_letter(news)
      puts "---------------------- Analizando la lista #{news.description}"

      #se obtienen los contactos que en su perfil tienen alguno de los paises de la lista
      contacts_match_countries = Contact.all_has_profile_by_countries(news.countries)

      contacts_match_countries.each do |contact|
      puts "-------- Analizando el contacto #{contact.first_name} #{contact.last_name}"

        #para cada contacto averiguo si tiene en el perfil las tematicas de los materiales de la lista
        news.materials.each do |material|
          puts "--- Analizando el material #{material.title}"
          if contact.has_profile_with_thematic?(material.thematic)
            puts "El contacto tiene la tematica del material"
            #se controla si ya no le ofreci al cliente del contacto ese material
            if !NewsOfferedMaterial.exist?(material, contact)
              puts "Al contacto no se le ha ofrecido el material"
              #se controla si el cliente asociado al contacto ya tiene el material (facturado, pedido, en su catalogo)
              customer = contact.reference
              if !AdministratorSystem::AdministratorSystemProxy::exist_order_for_material_and_customer?(material, customer)
                puts "no hay una orden"
                if !AdministratorSystem::AdministratorSystemProxy::exist_invoice_for_material_and_customer?(material, customer)
                  puts "no hay una factura"
                  if !AdministratorSystem::AdministratorSystemProxy::exist_customer_catalog_for_material?(material, customer)
                    puts "no tiene el material el cliente en su catalogo"
                    puts "estamos en condiciones de ofrecerle el material al cliente"
                    #estamos en condiciones de ofrecerle el material al cliente
                    if customer.nil?
                      customer_id = nil
                      customer_reference_type = nil
                    else
                      customer_id = customer.id
                      customer_reference_type = customer.class.to_s
                    end
                    NewsOfferedMaterial.create(:customer_reference_id => customer_id , :customer_reference_type => customer_reference_type, :material_id => material.id, :contact_id => contact.id, :offer_type => 'GeneralNewsLetter', :offer_date => Time.now, :state =>  NewsOfferedMaterial::STATE_READY_TO_SEND, :news_reference_id => news.id, :news_reference_type => news.class.to_s)
                  else
                    puts "ya tiene el material el cliente"
                  end
                else
                  puts "ya hay una factura"
                end
              else
                puts "ya hay una orden"
              end
            else
              puts "El material ya se le ha ofrecido al cliente"
            end
          else
            puts "El contacto no tiene la tematica del material #{material.title}"
          end
        end
      end

      #se marca a la lista como procesada
      news.state = GeneralNewsLetter::STATE_ALREADY_SENT
      news.save
    end
  end
end
